﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using BE;
using BE.SearchCriteria;

namespace DAL
{
    public class DevolucionesDAL : BaseDAL
    {
        public void InsertarDevolucion(DevolucionBE Devolucion)
        {
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "Devoluciones_i";
                cmd.Parameters.Add(new SqlParameter("@IdVendedor", Devolucion.Vendedor.IdVendedor ));
                cmd.Parameters.Add(new SqlParameter("@IdCampaña", Devolucion.Campaña.IdCampaña));
                cmd.Parameters.Add(new SqlParameter("@IdArticulo", Devolucion.Articulo.IdArticulo));
                cmd.Parameters.Add(new SqlParameter("@IdPresentacion", Devolucion.Presentacion.IdPresentacion));
                cmd.Parameters.Add(new SqlParameter("@Cantidad", Devolucion.Cantidad));
                cmd.Parameters.Add(new SqlParameter("@FechaAlta", Devolucion.FechaAlta));
                cmd.Parameters.Add(new SqlParameter("@IdCausa", Devolucion.CausaDevolucion.IdCausa));
                cmd.Parameters.Add(new SqlParameter("@Observaciones", Devolucion.Observaciones));
                cmd.Parameters.Add(new SqlParameter("@Estado", Devolucion.Estado));
               


                SqlParameter p = new SqlParameter();
                p.ParameterName = "@IdDevolucion";
                p.Direction = ParameterDirection.Output;
                p.SqlDbType = SqlDbType.Int;
                cmd.Parameters.Add(p);

                cnn.Open();
                cmd.ExecuteNonQuery();
                Devolucion.IdDevolucion = (Int32)cmd.Parameters["@IdDevolucion"].Value;
            }
        }

        public void UpdateDevolucion(DevolucionBE Devolucion)
        {
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "Devoluciones_u";
                cmd.Parameters.Add(new SqlParameter("@IdDevolucion", Devolucion.IdDevolucion));
                cmd.Parameters.Add(new SqlParameter("@IdArticulo", Devolucion.Articulo.IdArticulo));
                cmd.Parameters.Add(new SqlParameter("@IdPresentacion", Devolucion.Articulo.Presentacion.IdPresentacion));
                cmd.Parameters.Add(new SqlParameter("@Cantidad", Devolucion.Cantidad));
                cmd.Parameters.Add(new SqlParameter("@IdCausa", Devolucion.CausaDevolucion.IdCausa));
                cmd.Parameters.Add(new SqlParameter("@Observaciones", Devolucion.Observaciones));
                cmd.Parameters.Add(new SqlParameter("@Estado", Devolucion.Estado));

                cnn.Open();
                cmd.ExecuteNonQuery();
            }
        }

        public void DeleteByIdDevolucion(int pIdDevolucion)
        {
            try
            {
                using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
                {
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = cnn;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "Devoluciones_d";
                    cmd.Parameters.Add(new SqlParameter("@IdDevolucion", pIdDevolucion));
                    cnn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception)
            { throw; }

        }

        public DevolucionBE SeleccionarPorId(DevolucionBE pDevolucionBE)
        {
            DevolucionBE oDevolucionBE = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdDevolucion", pDevolucionBE.IdDevolucion));
                cmd.CommandText = "Devolucion_GetById";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    if (reader.Read())
                        oDevolucionBE = ConstruirDevolucion(reader);
                }

            }
            return oDevolucionBE;
        }

        public List<DevolucionBE> SeleccionarPorParametros(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
        {
            DevolucionSC wFiltroSC = (DevolucionSC)pFiltroSC;
            if (wFiltroSC == null)
                wFiltroSC = new DevolucionSC();

            List<DevolucionBE> listaDeDevolucionBE = null;
            using (SqlConnection cnn = new SqlConnection(GetConnectionString()))
            {
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cnn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@IdDevolucion", wFiltroSC.idDevolucion));
                cmd.Parameters.Add(new SqlParameter("@IdVendedor", wFiltroSC.IdVendedor));
                cmd.Parameters.Add(new SqlParameter("@IdCampaña", wFiltroSC.IdCampaña));
                cmd.Parameters.Add(new SqlParameter("@IdArticulo", wFiltroSC.IdCampaña));
                cmd.Parameters.Add(new SqlParameter("@Estado", wFiltroSC.Estado));
                cmd.Parameters.Add(new SqlParameter("@FechaDesde", wFiltroSC.FechaDesde));
                cmd.Parameters.Add(new SqlParameter("@FechaHasta", wFiltroSC.FechaHasta));
                cmd.Parameters.Add(new SqlParameter("@IdCausa", wFiltroSC.IdCausa));
                cmd.Parameters.Add(new SqlParameter("@pagesize", pPageSize));
                cmd.Parameters.Add(new SqlParameter("@pagenum", pPageNum));

                SqlParameter p = new SqlParameter();
                p.ParameterName = "@PageCount";
                p.Direction = ParameterDirection.Output;
                p.SqlDbType = SqlDbType.Int;
                cmd.Parameters.Add(p);

                cmd.CommandText = "Devoluciones_SeleccionarPorParametros";
                cnn.Open();
                SqlDataReader reader = null;
                reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    listaDeDevolucionBE = new List<DevolucionBE>();

                    while (reader.Read())
                    {
                        DevolucionBE oDevolucionBE = ConstruirDevolucion(reader);

                        listaDeDevolucionBE.Add(oDevolucionBE);
                    }
                }
                reader.Close();
                pCountReg = (Int32)cmd.Parameters["@PageCount"].Value;

            }
            return listaDeDevolucionBE;
        }

        private DevolucionBE ConstruirDevolucion(SqlDataReader reader)
        {
            DevolucionBE oDevolucionBE = new DevolucionBE();
            Object[] values = new Object[reader.FieldCount];

            reader.GetValues(values);

            oDevolucionBE.IdDevolucion  = Int32.Parse(reader["IdDevolucion"].ToString());

            if (reader["IdVendedor"] != DBNull.Value)
            {
                oDevolucionBE.Vendedor = new VendedorBE();
                oDevolucionBE.Vendedor.IdVendedor = Int32.Parse(reader["IdVendedor"].ToString());
                oDevolucionBE.Vendedor.Nombre = reader["Nombre"].ToString();
                oDevolucionBE.Vendedor.Apellido = reader["Apellido"].ToString();
            }

            if (reader["IdCampaña"] != DBNull.Value)
            {
                oDevolucionBE.Campaña = new CampañaBE();
                oDevolucionBE.Campaña.IdCampaña = Int32.Parse(reader["IdCampaña"].ToString());
                oDevolucionBE.Campaña.Descripcion = reader["Campaña"].ToString();
            }

            if (reader["IdArticulo"] != DBNull.Value)
            {
                oDevolucionBE.Articulo = new ArticuloBE();
               oDevolucionBE.Articulo.IdArticulo = Int32.Parse(reader["IdArticulo"].ToString());
               oDevolucionBE.Articulo.Descripcion = reader["Articulo"].ToString();
            }

            if (reader["IdPresentacion"] != DBNull.Value)
            {
                oDevolucionBE.Presentacion = new PresentacionBE(); 
                oDevolucionBE.Presentacion.IdPresentacion = Int32.Parse(reader["IdPresentacion"].ToString());
                oDevolucionBE.Presentacion.Descripcion = reader["Presentacion"].ToString();
            }
           
            oDevolucionBE.Cantidad = Int32.Parse(reader["Cantidad"].ToString());
            oDevolucionBE.FechaAlta = DateTime.Parse(reader["FechaAlta"].ToString());
            oDevolucionBE.Observaciones = reader["Observaciones"].ToString();
            oDevolucionBE.Estado = Int32.Parse(reader["Estado"].ToString());

            oDevolucionBE.CausaDevolucion = new CausaDevolucionBE();
            if (reader["IdCausa"] != DBNull.Value)
            {
                oDevolucionBE.CausaDevolucion.IdCausa = Int32.Parse(reader["IdCausa"].ToString());
                oDevolucionBE.CausaDevolucion.Descripcion = reader["Descripcion"].ToString();
            }


            return oDevolucionBE;
        }

    }
}
